/**
 * @param {string} s
 * @return {string}
 */
var removeDuplicateLetters = function (s) {
  let stack = [] // 存放去重的结果的栈
  // 使用一个计数器维护字符的数量
  let map = {} // 记录单词出现的次数
  for (let char of s) {
    if (map[char] === undefined) {
      map[char] = 0
    }
    map[char]++
  }
  let inStack = {}
  for (let char of s) {
    // 每次遍历一个都讲map中的个数-1
    map[char]--
    if (inStack[char]) continue // 如果这个元素存在 就调过
    // 否则放入栈中
    // 插入之前,和前面的元素比较一下大小如果字典序小于之前的元素，就弹出前面的元素，然后再插入新元素
    while (stack.length !== 0 && stack[stack.length - 1] > char) {
      // 如果后面不再出现这个栈顶元素,就停止pop
      if (map[stack[stack.length - 1]] === 0) {
        break
      }
      // 否则就弹出栈顶的元素
      let charPop = stack.pop() // 弹出栈顶的元素
      inStack[charPop] = false
    }
    stack.push(char)
    // 标记存在
    inStack[char] = true
  }
  return stack.join('')
}
console.log(removeDuplicateLetters('cbacdcbc'))
